#include <iostream>

using namespace std;

class student_t {
  private: // 私有的
    int m_a;
    int m_b;

  public: // 共有的
    // 声明构造函数
    student_t(int b);
    void show();
};

/*定义构造函数
    (1)构造函数必须是 public 属性的，必须与类名相同, 否则创建对象时无法调用。
    (2)没有变量来接收返回值，即使有也毫无用处, 不管是声明还是定义，函数名前面都不能出现返回值类型，即使是 void也不允许；函数体中不能有 return 语句。
    (3)如果用户自己没有定义构造函数，那么编译器会自动生成一个默认的构造函数，只是这个构造函数的函数体是空的，也没有形参，也不执行任何操作
       student_t::student_t(){}
    (4)成员变量的初始化顺序与初始化列表中列出的变量的顺序无关，它只与成员变量在类中声明的顺序有关。
*/
student_t::student_t(int b) : m_b(b), m_a(m_b)
{
    // TODO:
}
/* 我们将 m_b 放在了 m_a 的前面，看起来是先给 m_b 赋值，再给 m_a 赋值，其实不是
   成员变量的赋值顺序由它们在类中的声明顺序决定，在 student_t 类中，我们先声明的 m_a，再声明的 m_b，所以构造函数和下面的代码等价：
    student_t::student_t(int b) : m_b(b), m_a(m_b)
    {
        m_a = m_b;
        m_b = b;
    }
*/
void student_t::show()
{
    cout << "m_a=" << m_a << ", m_b=" << m_b << endl;
}

int main()
{
    // 调用构造函数 student_t()
    student_t *pstu = new student_t(100);
    pstu->show();

    delete pstu; // 释放内存
    pstu = NULL; // 指针置空
    return 0;
}
